#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0;bool f=0;char ch=getchar();
	while(ch<'0'||ch>'9')f^=(ch=='-'),ch=getchar();
	while('0'<=ch&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}
const int Maxn=131071+5,inf=1e18;
int n,fa[Maxn],dis[Maxn];
vector<int>G[Maxn];
namespace sub1{
	int dep[Maxn];
	void dfs(int u,int v){
		dep[u]=dep[v]+1;
		for(int y:G[u]){
			dis[y]+=dis[u];
			dfs(y,u);
		}
	}
	inline int lca(int u,int v){
		if(dep[u]<dep[v])swap(u,v);
		while(dep[u]>dep[v])u=fa[u];
		while(u!=v)u=fa[u],v=fa[v];
		return u;
	}
	int b[Maxn],tot;
	
	int a[Maxn],len;
	void dfs1(int u){
		if(G[u].empty())a[++len]=u;
		for(int y:G[u])dfs1(y);
	}
	
	inline void solve(){
		dfs(1,0);
		for(int i=1;i<=n;i++)if(G[i].size()==2)b[++tot]=i;
		int ans=inf;
		random_shuffle(b+1,b+1+tot);
		tot=min(tot,21ll);
		for(int s=0;s<(1<<tot);s++){
			len=0;int res=0;
			for(int i=1;i<=tot;i++){
				int u=b[i];
				if((s>>i-1)&1)swap(G[u][0],G[u][1]);
			}
			dfs1(1);
			for(int i=1;i<len;i++){
				res=max(res,dis[a[i]]+dis[a[i+1]]-2*dis[lca(a[i],a[i+1])]);
			}ans=min(ans,res);
//			for(int i=1;i<=len;i++)printf("%d ",a[i]);puts("");
			
			for(int i=1;i<=tot;i++){
				int u=b[i];
				if((s>>i-1)&1)swap(G[u][0],G[u][1]);
			}
			
		}printf("%lld\n",ans);
	}
}
signed main(){
	freopen("trip.in","r",stdin);
	freopen("trip.out","w",stdout);
	n=read();
	for(int i=2;i<=n;i++){
		fa[i]=read();dis[i]=read();
		G[fa[i]].push_back(i);
	}
	sub1::solve(),exit(0);
	return 0;
}
/*
9
1 56
1 55
2 57
2 77
4 98
4 90
6 76
6 66

7
1 1
1 1
2 1
2 1
3 1
3 1
*/
